/* type关键字:用于给类型起一个新名字 */
type t1 = string|number
type t2 = boolean

let tl1:t1 = 'zje'
console.log("type1：",tl1)
let tl2:t2 = false
console.log("type2：",tl2)

type t3 = {
    name:string,
    age:number
}

let tl3:t3 ={
    name:'Tom',
    age:23
}
console.log("type3：",tl3,'\n')
/* type用法：
1.‌定义基本类型别名‌：例如 type Second = number，让 Second 成为 number 类型的别名

2.‌定义对象类型‌：例如 type userOjb = { name: string }，用于描述对象的形态

3.‌定义函数类型‌：例如 type getName = () => string，用来描述函数的类型

4.‌定义元组类型‌：例如 type data = [number, string]

5.‌定义联合类型‌：例如 type Status = 'success' | 'error'，让变量只能是几个特定值中的一个

6.‌定义交叉类型‌：通过 & 符号合并多个类型，例如结合 Person 和 Employee 类型创建 EmployeePerson 类型
*/


// interface 与 type 相比，interface 可以继承
interface people{
    name:string,
    age:number
}

type people1={
    name:string,
    age:number
}


// interface 继承：
interface p extends people{
    height:number
}
// type p1 extends people1 ={height:number} 编译错误
let pl:p ={
    name:'Jack',
    age:24,
    height:185
}
console.log('继承显示: ',pl,'\n')

// type 可以通过交叉实现与 interface 继承一样的效果
// type交叉： 通过 ‘&’ 进行，最后会输出两个交叉的合并项
// 交叉时：如果同属性名的类别不同，属性的类别将变为never；
//      any类型在与除never类型以外的任何类型交叉时，结果都为any类型
type people2={
    name:string,
    height:number
}
let pl2:people1&people2 ={
    name:' Zoom',
    age:23,
    height:175
}
console.log("交叉显示：",pl2,'\n')


// 断言：as
let e1:unknown = 45.562
console.log('通过断言保留两位小数：',(e1 as number).toFixed(2),'\n')
e1 = 'Zhem'
console.log('通过断言输出大写: ',(e1 as string).toUpperCase())



